package com.corpgovernment.organization.service;

import com.corpgovernment.api.organization.bo.OrgAndDataPermissionInfoBO;
import com.corpgovernment.api.organization.bo.SearchInvoiceInfoRequestBO;
import com.corpgovernment.api.organization.bo.SearchInvoiceInfoResponseBO;
import com.corpgovernment.api.organization.bo.SearchOrgInfoRequestBO;
import com.corpgovernment.api.organization.model.ffpinfo.GetFfBasicsInfoResponse;
import com.corpgovernment.api.organization.model.org.ListOrgTreeByConditionResponse;
import com.corpgovernment.api.organization.model.org.OrgInfoVo;
import com.corpgovernment.api.organization.model.org.front.CompanyVo;
import com.corpgovernment.api.organization.model.org.front.FfpRequest;
import com.corpgovernment.api.organization.model.org.front.ListOrgTreeByConditionRequest;
import com.corpgovernment.api.organization.model.org.front.RoutCompanyVo;
import com.corpgovernment.api.organization.model.org.queryorgparentcompany.QueryOrgParentCompanyRequest;
import com.corpgovernment.api.organization.model.org.queryorgparentcompany.QueryOrgParentCompanyResponse;
import com.corpgovernment.api.organization.model.org.request.*;
import com.corpgovernment.api.organization.model.org.response.DeleteResponse;
import com.corpgovernment.api.organization.model.org.response.GetOrgInfoResponseNew;
import com.corpgovernment.api.organization.model.settlement.QueryOrgInfoWithPermissionRequest;
import com.corpgovernment.api.organization.model.settlement.QueryOrgInfoWithPermissionResponse;
import com.corpgovernment.api.organization.vo.GetOrgTreeReq;
import com.corpgovernment.api.organization.vo.GetOrgTreeRsp;
import com.corpgovernment.api.organization.vo.TransferEmployeeOrgInfoVo;
import com.corpgovernment.common.base.BaseUserInfo;
import com.corpgovernment.common.base.JSONResult;
import com.corpgovernment.organization.dto.MbOrgEmployeeInfoDto;
import com.corpgovernment.organization.entity.db.MbOrgEmployeeInfo;
import com.corpgovernment.organization.entity.db.MbOrgInfo;
import com.corpgovernment.organization.model.*;
import com.corpgovernment.organization.model.org.dto.OrgInfoAllDto;
import com.corpgovernment.organization.vo.FfpPageVo;
import com.corpgovernment.organization.vo.GetOrgTreeRequest;
import com.corpgovernment.organization.vo.ListEmployeeInOrgVO;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import java.util.Set;

public interface IOrganizationInfoService {

    /**
     * 编辑组织信息
     *
     * @param request
     * @return
     */
    JSONResult<Long> updateOrgInfo(UpdateOrgRequest request);

    /**
     * 获取组织信息
     *
     * @param request
     * @return
     */
    JSONResult<GetOrgInfoResponseNew> getOrgInfo(GetOrgInfoRequest request);

    /**
     * 删除组织信息
     *
     * @param request
     * @return
     */
    DeleteResponse delete(DeleteRequest request, BaseUserInfo baseUserInfo);

    /**
     * 更新组织结构
     *
     * @param mbOrgInfo
     * @return
     */
    boolean updateBaseOrgInfo(MbOrgInfo mbOrgInfo);


    /**
     * 查询公司 并分组
     *
     * @return
     */
    JSONResult<Map> findAllCompanyInfoGroupByLevel(BaseUserInfo baseUserInfo);

    /**
     * 根据名字关键字查询公司
     *
     * @param keyword
     * @return
     */
    JSONResult<RoutCompanyVo> searchComapny(String keyword);


    boolean createOrgInfo(MbOrgInfo mbOrgInfo);

    boolean insertMbOrgInfo(MbOrgInfo mbOrgInfo);

    /**
     * 更新组织架构信息
     *
     * @param mbOrgInfo 组织结构数据
     * @return 是否操作成功
     */
    boolean update(MbOrgInfo mbOrgInfo);

    /**
     * 通过组织结构id查询组织信息
     *
     * @param orgId 组织结构id
     * @return MbOrgInfo
     */
    MbOrgInfo findByOrgId(String orgId);

    /**
     * 通过主键ID 获取组织信息
     *
     * @return MbOrgInfo
     */
    MbOrgInfo findById(Long id);

    /**
     * 通过组织结构id查询组织信息
     *
     * @param orgId 组织结构id
     * @return MbOrgInfo
     */
    MbOrgInfo findByOrgId(String orgId, Boolean withDeleted);

    /**
     * 查询组织信息
     *
     * @param parentOrgId 父级id
     * @param isAll       是否查询到顶级
     * @return
     */
    List<OrgInfoVo> getParentOrgInfoList(String parentOrgId, int parentLevel, boolean isAll);

    /**
     * 查询组织信息
     *
     * @param orgId orgId
     * @param isAll 是否查询到顶级
     * @return
     */
    List<OrgInfoVo> getOrgInfoList(String orgId, boolean isAll);

    /**
     * 查询所有组织信息
     *
     * @return MbOrgInfo
     */
    List<MbOrgInfo> listAll();

    List<OrgInfoAllDto> getOrgAllSomeParams();

    /**
     * 批量查询组织架构的名称
     *
     * @param orgIds 组织架构名称
     * @return MbOrgInfo列表
     */
    List<MbOrgInfo> listNameByOrgIds(List<String> orgIds);

    /**
     * 通过组织id查找所有子组织id
     *
     * @param orgId  组织id
     * @param orgIds
     */
    void findAllChildOrgIdsByOrgId(String orgId, List<String> orgIds);

    /**
     * 通过子公司id查询子公司下直属部门信息，子公司下的子公司不包括
     *
     * @param orgId 子公司id(也就是组织结构id)
     * @param name  名称不为空的时候模糊匹配查询
     * @return 直属部门信息 id，name
     */
    List<MbOrgInfo> findFirstLevelChildrenDepartmentByOrgId(String orgId, String name);

    List<MbOrgInfo> findMbOrgInfoByOrgId(String orgId, String name);

    /**
     * 查询组织架构下所有子架构，包含当前orgId
     *
     * @param id
     * @return
     */
    List<String> listAllChildOrgIdsByOrgId(String id);

    /**
     * 查询末级分公司
     *
     * @param departmentId
     * @return
     */
    MbOrgInfo findRecentCompanyIdByOrgId(String departmentId);

    public MbOrgInfo findRecentCompanyIdByOrgId(String departmentId,List<MbOrgInfo> allMbOrgInfoList);

    /**
     * 查询究极顶级公司
     *
     * @param departmentId
     * @return
     */
    MbOrgInfo findFirstCorpInfo(String departmentId);

    /**
     * 查询上面第一个为公司类型的组织
     *
     * @param departmentId
     * @return
     */
    MbOrgInfo findFirstCompany(String departmentId);

    /**
     * 通过组织架构id，查询该id所在末级子公司的下属所有部门ids
     *
     * @param orgId
     * @return
     */
    List<String> listRecentCompanyAllDepartmentByOrgId(String orgId);

    /**
     * 通过组织架构id，查询该id所在末级子公司的下属所有组织ids(包含末级公司的组织id)
     */
    List<String> listRecentCompanyAllOrgIds(String orgId);

    /**
     * 通过组织架构id，查询该id所下属所有部门ids
     *
     * @param orgId
     * @return
     */
    List<String> listAllDepartmentByOrgId(String orgId);
    /**
     * 根据组织架构id  是否查询子公司下所有部门id
     * @param request
     * @return
     */
    List<String> listAllDepartmentByOrgId(GetOrgTreeRequest request);

    /**
     * 查询组织下所有子部门（不包含该组织），不穿透子公司
     */
    List<MbOrgInfo> listAllDepartments(String orgId, Boolean withDeleted);

    /**
     * 查询组织下直属子部门（不包含该组织），不穿透子公司
     */
    List<MbOrgInfo> listAllDepartmentsByParentId(String parentId, Boolean withDeleted);

    /**
     * 查询组织下所有子部门id（不包含该组织），不穿透子公司
     */
    List<String> listAllDepartmentIds(String orgId, Boolean withDeleted);

    /**
     * 查询组织下所有子部门id（不包含该组织），穿透子公司
     * @param orgId
     * @param withDeleted
     * @param penetrate
     * @return
     */
    List<String> listAllDepartmentIds(String orgId, Boolean withDeleted,Boolean penetrate);

    /**
     * 查询组织下（不包含该组织）所有子公司id
     */
    List<String> listAllCorpIds(String orgId, Boolean withDeleted);

    /**
     * 通过组织架构id，查询该id所在末级子公司的直系下属所有部门ids
     *
     * @param orgId
     * @return
     */
    List<String> listRecentCompanyDirectDepartmentWithCompanyByOrgId(String orgId);

    /**
     * 模糊查询公司
     *
     * @param name
     * @param orgType
     * @return
     */
    List<CompanyVo> getCompaniesByName(String name, String orgType, BaseUserInfo baseUserInfo);

    /**
     * 分页查询
     *
     * @param ffpRequest   ffpRequest
     * @param baseUserInfo baseUserInfo
     * @return JSONResult
     */
    JSONResult<FfpPageVo> getFfpItems(FfpRequest ffpRequest, BaseUserInfo baseUserInfo);

    /**
     * 删除常旅信息
     *
     * @param ffpIdRequest ffpIdRequest
     * @return JSONResult
     */
    JSONResult deleteFfpItem(FfpIdRequest ffpIdRequest);

    /**
     * 新增常旅信息
     *
     * @param ffpAddRequest ffpModifyRequest
     * @return JSONResult
     */
    JSONResult saveFfpItem(FfpAddRequest ffpAddRequest, BaseUserInfo baseUserInfo);

    JSONResult modifyFfpItem(FfpModifyRequest ffpModifyRequest, BaseUserInfo baseUserInfo);

    /**
     * 批量查询组织架构
     *
     * @param orgIds
     * @return
     */
    List<MbOrgInfo> listByOrgIds(List<String> orgIds);

    /**
     * 批量查询组织架构为公司的
     *
     * @param businessCodes
     * @return
     */
    List<MbOrgInfo> listCompanyByBusinessCodes( List<String> businessCodes);

    /**
     * 批量查询组织架构
     *
     * @param ids
     * @return
     */
    List<MbOrgInfo> listByIds(List<String> ids);


    /**
     * 批量封装用户末级子公司id
     *
     * @param list
     */
    List<MbOrgEmployeeInfoDto> batchFindRecentCompanyIdByOrgId(List<MbOrgEmployeeInfo> list);

    /**
     * 更新组织结构联系人信息
     *
     * @param mbOrgInfo 组织结构信息
     * @return
     */
    boolean updateContactInfo(MbOrgInfo mbOrgInfo);

    int updateByOrgId(MbOrgInfo mbOrgInfo);

    int batchUpdate(List<MbOrgInfo> mbOrgInfoList);

    /**
     * 批量修改组织结构
     *
     * @param orgIds
     * @param status
     * @return
     */
    boolean batchUpdateStatus(List<String> orgIds, String status);

    /**
     * 根据指定orgId查询组织路径信息
     * 例：
     * 中铁三局>建设公司>工程一部
     * 中铁三局>建设公司
     * 中铁三局
     *
     * @param orgId
     * @return
     */
    String findOrgPath(String orgId);

    /**
     * 模糊查询组织结构
     *
     * @param keyWord
     * @return
     */
    List<MbOrgInfo> fuzzyByName(String keyWord);

    /**
     * 模糊查询组织结构
     *
     * @param keyWord
     * @return
     */
    List<MbOrgInfo> fuzzyByNameAndType(String keyWord, String type);

    /**
     * 查询所有公司
     *
     * @param pageSize
     * @param pageNum
     * @return
     */
    List<MbOrgInfo> listAllCompany(Integer pageSize, Integer pageNum);

    /**
     * 查询所有公司
     *
     * @param pageSize
     * @param pageNum
     * @return
     */
    List<MbOrgInfo> listAllCompanyWithDeleted(Integer pageSize, Integer pageNum);

    /**
     * 修改组织架构的机火统一支付开关
     *
     * @param orgIds
     */
    boolean batchUpdateOpenUnitePayment(List<String> orgIds, boolean openStatus);

    /**
     * 根据关键字搜索公司
     *
     * @param request 搜索请求
     * @return 搜索结果
     */
	ResisterOrgResponseVO search(RegisterOrgRequest request);

	/**
	 * 根据公司id搜索部门不包含子公司
	 *
	 * @param request
	 * @return
	 */
	JSONResult corpSearch(RegisterOrgRequest request);

	Set<String> getAllChildDepartmentListNoPenetrate(String orgId);

	/**
	 * 获取所有启用的组织id
	 *
	 * @return
	 */
	List<String> listAllValidOrgId();

	SearchInvoiceInfoResponseBO searchInvoiceInfo(SearchInvoiceInfoRequestBO request);

	/**
	 * 查询组织信息
	 *
	 * @param requestBO
	 * @return
	 */
	OrgInfoVo searchOrgInfo(SearchOrgInfoRequestBO requestBO);

    List<GetFfBasicsInfoResponse> getFfBasicsInfo(String uid);

    Boolean batchTransferEmployeeOrgInfo(TransferEmployeeOrgInfoVo request);

    GetOrgTreeRsp getOrgTree(GetOrgTreeRequest request);
    List<GetOrgTreeRsp> getOrgTreeWhole();

    String createOrgCode(String orgId);

    MbOrgInfo findByBusinessCode(String businessCode);

    List<MbOrgInfo> listByBusinessCode(List<String> businessCode);

    MbOrgInfo selectOneByOrgId(String orgId);

    boolean updateParentBusinessCode(String businessCode, String newBusinessCode);

    int batchInsertOrgInfo(List<MbOrgInfo> mbOrgInfoList);

    int deleteByOrgIds(List<String> orgIds);

    void delRoleOrgDataInfo(BaseUserInfo baseUserInfo, MbOrgInfo orgInfo);

    /**
     * 根据orgId批量查询组织结构信息包括删除的组织信息
     * @param orgIds
     * @return
     */
    List<MbOrgInfo> listAllByOrgIds(List<String> orgIds);

    /**
     *  获取完整组织树
     * @param request
     * @return
     */
    List<OrgAndDataPermissionInfoBO> wholeOrgTree(GetOrgTreeReq request);

    JSONResult<Boolean> modifyPassenger(PassengerModifyRequest passengerModifyRequest, BaseUserInfo baseUserInfo);

    boolean nameRepeatQuery(NameRepeatQueryRequest nameRepeatQueryRequest);

    QueryOrgInfoWithPermissionResponse queryOrgIdWithPermission(QueryOrgInfoWithPermissionRequest request);

    List<OrgInfoVo> findAllByBusinessCodeList(List<String> businessCode);
    /**
     *  根据条件查询员工数据
     */
    Pair<List<MbOrgEmployeeInfo>,Long> listEmployeeInOrg(ListEmployeeInOrgVO request);


    QueryOrgParentCompanyResponse queryOrgParentCompany(QueryOrgParentCompanyRequest request);

    /**
     * 根据条件查询组织信息
     * @param request
     * @return
     */
    List<ListOrgTreeByConditionResponse> listOrgTreeByCondition(ListOrgTreeByConditionRequest request, BaseUserInfo baseUserInfo);

    List<MbOrgInfo> filterByRole(List<MbOrgInfo> mbOrgInfoList, BaseUserInfo baseUserInfo);
}
